/*
 * physical_layer_commons.h
 *
 *  Created on: Oct 10, 2012
 *      Author: m
 */

#ifndef PHYSICAL_LAYER_COMMONS_H_
#define PHYSICAL_LAYER_COMMONS_H_

#include <memory>
#include <exception>
#include <iostream>
#include <fstream>

namespace physical
{

typedef unsigned long blockNumber;
typedef char byte;

typedef byte byteStream[];
typedef std::unique_ptr<physical::byteStream> UP_byteStream;

typedef std::ios_base::openmode openmode;

/**
 * Excepción Genérica de la capa física
 */
class PhysicalException : public std::exception
{
};

/**
 * Verifica si un archivo existe
 *
 * @param filename Nombre del archivo a verificar
 * @return true si el archivo existe, false en caso contrario
 */
inline bool fileExists( const char* filename )
{
    bool openFailed;
    std::ifstream file( filename );
    openFailed = file.fail();
    file.close();
    return !openFailed;
}

/**
 * Devuelve el tamaño de un archivo
 *
 * @param filename Nombre del archivo a verificar
 * @return Tamaño en bytes del archivo
 */
inline size_t getFileSize ( const char* filename )
{
    std::streampos fsize = 0;
    std::ifstream file( filename );

    // compute file size
    fsize = file.tellg();
    file.seekg( 0, std::ios::end );
    fsize = file.tellg() - fsize;

    return fsize;
}

}

#endif /* PHYSICAL_LAYER_COMMONS_H_ */
